package MODEL;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.GregorianCalendar;
import java.util.ArrayList;
import oracle.jdbc.OracleTypes;

/**
 * Classe de mapeamento da entidade show
 */
public class ShowModel extends AbstractModel {
    private String                local;
    private LineUpModel           lineUp;
    private GregorianCalendar     horarioInicio;
    private ArrayList<BandaModel> bandas;
    private CallableStatement     chamada;
    private ResultSet             resultado;

    public ShowModel() {
        
    }

    public ShowModel(String local, LineUpModel lineUp, GregorianCalendar horarioInicio) {
        this.local         = local;
        this.lineUp        = lineUp;
        this.horarioInicio = horarioInicio;
    }
    
    public String getLocal() {
        return local;
    }

    public void setLocal(String local) {
        this.local = local;
    }

    public LineUpModel getLineUp() {
        return lineUp;
    }

    public void setLineUp(LineUpModel lineUp) {
        this.lineUp = lineUp;
    }

    public GregorianCalendar getHorarioInicio() {
        return horarioInicio;
    }

    public void setHorarioInicio(GregorianCalendar horarioInicio) {
        this.horarioInicio = horarioInicio;
    }

    public ArrayList<BandaModel> getBandas() {
        return bandas;
    }
    
    /**
     * Método busca de bandas no banco de dados
     * 
     * @param conexao
     * @return ArrayList<BandaModel>
     * @throws java.sql.SQLException
     */ 
    public ArrayList<BandaModel> getBandasDB(Connection conexao) throws SQLException {
   
        try {
            chamada = conexao.prepareCall("call F_GET_BANDAS(?,?,?)");
            chamada.setDate(1, calendarToDateSQL(lineUp.getData()));
            chamada.setString(2, local);
            chamada.registerOutParameter(3, OracleTypes.CURSOR);
            chamada.execute();
            resultado = (ResultSet) chamada.getObject(3);
        } catch (SQLException e) {
            //System.out.println(e.getMessage());
        }        

        bandas = new ArrayList<>();
        while (resultado.next()) {
            bandas.add(new BandaModel(
                resultado.getString("nome"),
                resultado.getString("historia"),
                resultado.getString("site"),
                resultado.getString("local"),
                lineUp,
                resultado.getInt("ordem_apresentacao")
            ));
        }

        return bandas;    
    }
    
    public void setBandas(ArrayList<BandaModel> bandas) {
        this.bandas = bandas;
    }
}
